/* SexpServerFormatterSinkProvider.cs -- 
   Copyright (C) 2008  Casey Marshall.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.  */


using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Serialization;
using SexpSharp.Serialization;

namespace SexpSharp.Remoting
{
	public sealed class SexpServerFormatterSinkProvider : IServerFormatterSinkProvider,
		IServerChannelSinkProvider
	{
		private IServerChannelSinkProvider next;
        private TypeCache classCache;
        private SexpFormatter serialFormatter;
        private SexpFormatter deserialFormatter;

        public SexpServerFormatterSinkProvider()
        {
            classCache = new TypeCache();
            serialFormatter = new SexpFormatter(classCache);
            serialFormatter.Context = new StreamingContext(StreamingContextStates.Remoting);
            serialFormatter.SurrogateSelector = new RemotingSurrogateSelector();
            deserialFormatter = new SexpFormatter(classCache);
            deserialFormatter.Context = new StreamingContext(StreamingContextStates.Remoting);
        }

        public IServerChannelSink CreateSink(IChannelReceiver receiver)
		{
			IServerChannelSink channel = next.CreateSink(receiver);
            return new SexpServerFormatterSink(channel, receiver, serialFormatter,
                                               deserialFormatter);
		}

        public void GetChannelData(IChannelDataStore channelData)
		{
			if (next != null)
				next.GetChannelData(channelData);
		}

        public IServerChannelSinkProvider Next
		{
			get {
				return next;
			}
			set {
				next = value;
			}
        }

        public Format Format
        {
            get {
                return serialFormatter.SerializeFormat;
            }
            set {
                serialFormatter.SerializeFormat = value;
            }
        }
	}
}